package bliVideo

//02-Kotlin的诞生  https://www.bilibili.com/video/BV1wf4y1s7TG?p=2
/**
 * 2011年，JetBrains宣布开发Kotlin编程语言，这门新语言可以用来编写在Java虚拟机上运行的代码，
 * 是Java和Scala语言之外的又一选择。
 */

//03-Kotlin与JVM  https://www.bilibili.com/video/BV1wf4y1s7TG?p=3
/**
 * Java   ────┐                                 ┌──── Windows
 * Kotlin ────┤ 编译          运行       指令    │
 * Scala  ────┼─────→ 字节码 ─────→ JVM ─────→  ├────  Linux
 * Groovy ────┘                                 └────  macOS
 *
 *                                                  操作系统
 * Groovy: gradle就是使用的这个语法
 */

//04-为什么要学Kotlin  https://www.bilibili.com/video/BV1wf4y1s7TG/?p=4
/**
 * Java语言比较稳健，久经考验。多年来，它一直是最常用的一种编程语言，造就了庞大的生产代码库。
 * 自从1995年Java问世以来，对于优秀的编程语言应满足什么条件人们已通过实践积攒了很多经验教训。
 * 然而，Java却裹足不前，开发者喜欢的很多现代语言高级特性，它都没有，或者迟迟加入。
 * Kotlin从这些经验教训中受益良多，而Java中的某些早期设计却愈显陈旧。
 * 脱胎于旧语言，Kotlin解决了他们的很多痛点进化成了一门优秀的语言。
 * 相比Java，Kotlin进步巨大，带来了更可靠的开发体验
 */

//05-Kotlin的垮平台特性  https://www.bilibili.com/video/BV1wf4y1s7TG?p=5
/**
 * Kotlin不仅支持编写代码在虚拟机上运行，而且还是一门垮平台的通用型语言，
 * 我们可以用Kotlin开发各种类型的原生应用，如Android、macOs、Windows、Javascript应用。
 * Kotlin能脱离虚拟机层，直接编译成可以在Windows、Linux和macOS平台上运行的原生二进制代码。
 */

//07-声明变量和内置数据类型  https://www.bilibili.com/video/BV1wf4y1s7TG?p=7
/**
 * Idea 创建项目:
 *      File -> New -> Project -> Kotlin -> JVM|IDEA,
 *      右击项目 -> New -> Module -> Kotlin -> JVM|IDEA -> kotlinTest,  Use Library='KotlinJavaRuntime (2)'
 */
fun main11() {
    var str0: String = "Hello World!"   //声明变量

    //08-只读变量 https://www.bilibili.com/video/BV1wf4y1s7TG?p=8
    val str1: String = "Hello World!"

    //09-类型推断 https://www.bilibili.com/video/BV1wf4y1s7TG?p=9
    val str2         = "Hello World!"
    println("$str0, $str1, $str2")
}


//10-编译时常量 https://www.bilibili.com/video/BV1wf4y1s7TG?p=10
/**
 * 只读变量并非绝对只读。
 * 编译时常量只能在函数之外定义，因为编译时常量必须在编译时赋值，而函数都是在运行时才调用，函数内的变量也是在运行时赋值，编译时常量要在这些变量赋值前就已存在
 * 编译时常量只能是常见的基本数据类型:
 *  String、Int、Double、Float、Long、Short、Byte、Char、Boolean。
 */
const val PI = 3.1415926F       //public static final float PI = 3.1415925F;


//11-查看Kotlin字节码 https://www.bilibili.com/video/BV1wf4y1s7TG?p=11
/**
 * 查看Kotlin编译之后的字节码，有助于我们深入理解Kotlin语言。
 * 两种方式:
 *      1. Shift键两次，输入Show kotlin
 *      2. Tools -> Kotlin -> Show Kotlin Bytecode
 */


//12-Kotlin的引用类型 https://www.bilibili.com/video/BV1wf4y1s7TG?p=12
/**
 * Java有两种数据类型:引用类型与基本数据类型.
 * Kotlin只提供引用类型这一种数据类型，出于更高性能的需要，Kotlin编译器会在Java字节码中改用基本数据类型.
 */


//13-range表达式 https://www.bilibili.com/video/BV1wf4y1s7TG?p=13
fun main12() {
    val age = 3
    if (age in 0..3) {
        println("age in 0..3")
    } else {
        println("Unknown")
    }

    if (age !in 4..9) {
        println("age not in 4..9")
    }
}


//14-when表达式 https://www.bilibili.com/video/BV1wf4y1s7TG?p=14
fun main13() {
    fun getLevel(school: String): Any {
        val level: Any = when (school) {
            "学前班" -> "幼儿"
            "小学" -> "少儿"
            else -> println("未知")
        }
        return level
    }
    println(getLevel("小学"))
    println(getLevel("大学"))      //kotlin.Unit
}


//15-string模板 https://www.bilibili.com/video/BV1wf4y1s7TG?p=15
fun main14() {
    val origin = "Jack"
    val dest = "Rose"
    println("$origin love $dest")

    fun printAnswer(flag: Boolean) {
        //实际代码: String var1 = "The answer is: " + (flag ? "我可以" : "对不起");
        println("The answer is: ${if (flag) "我可以" else "对不起"}")
    }
    printAnswer(false)
}


